/* AgendaServidor.c - code for example server program that uses TCP */
#ifndef unix
#define WIN32
#include <windows.h>
#include <winsock.h>
#else
#define closesocket close
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <pthread.h> // Linkar com a SO para compilar -l pthread

#endif
#include <mysql.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <regex.h>


#define PROTOPORT       6666            /* default protocol port number */
#define QLEN            6               /* size of request queue        */

/* Definição das constantes do protocolo. */
#define LOGIN       1
#define ADD         2
#define REMOVEALL   3
#define REMOVE      4
#define UPDATE      5
#define GET         6
#define GETALL      7


/* Definição de constantes para operaçao com arquivos */
//opcoes
#define _G "--g" //garante que se nao existir, crie
#define _I "--i" //se nao existir, ignore DEFAULT

//modos
#define _R "--r" //read DEFAULT
#define _W "--w" //write

/* Caminhos padrões definidos  */
#define USERS_ARQ "test.txt" // arquivo de usuários
#define TEMP_ARQ "temp.txt" // arquivo temporário para cópia

FILE *fr, *fw; // fd sempre para leitura fw para escrita
static int status = 0; // indicador de encontro ou insercao
static int eof = 0; // indicador de leitura de fim de arquivo

/* Definindo uma Struct para atender as requisições */
typedef struct atende{
    int endereco;
    char dadosOrigem[22];
} atende;

typedef struct Comando{
    int protocolo;
    char usuario[21];
    char senha[21];
    char data[9];
    char horaI[5];
    char horaF[5];
    char msg[230];
} Comando;

void printComando(const char*,Comando*,const char*);
int matchUsername(const char *);
int doLogin(char *, char *);

void createFile(char *, char *, char *);

/* Funções que tratam as requisições do Servidor*/
void handlerReqGet(Comando *cmd, char *msgRetorno);
void handlerReqGetAll(Comando *cmd, char* msgRetorno, MYSQL_RES** resultSet);
void compoeData( char* data, char** retorno );
char* decompoeData( char* data, char** retorno );
char* compoeHora( char* hora, char** retorno );
char* decompoeHora( char* hora, char** retorno );
